iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0

「關於函式的首要準則,就是要簡短。第二項準則,就是要比第一項的簡短函式還要更簡短。這是一個我無法證明的主張」
作者提到的這句話我深感認同,函式就是要跟uber eat的等待時間一點越短越好,越短的函式通常擁有兩個特點,1. 只做一件事 2. 易讀

參數

一個函式的參數跟存款不一樣,不是越多越好,1 ~ 2個會是最好的情況,
當你有太多的參數,使用物件會是一個解決大量參數有效的做法

//Bad

function createArticle(title, content, author, date){
	// ...
}

//Better

function createArticle({title, content, author, date}){
	//...
}

用物件還有一個好處,就是可以使用解構(Destructuring)的方式,function只拿到物件中自己需要的屬性,而且解構語法還會避免動到原始資料而產生Side Effect

只做一件事

畫線,重要,這會考,不管在什麼時候,在撰寫任何function時,讓他只有一個功能,會有以下好處

  • 好理解
  • 好測試
  • 好重構
  • 好棒棒
//Bad
function emailClients(clients) {
  clients.forEach(client => {
    const clientRecord = database.lookup(client);
    if (clientRecord.isActive()) {
      email(client);
    }
  });
}

//Better
function emailActiveClients(clients) {
  clients.filter(isActiveClient).forEach(email);
}

function isActiveClient(client) {
  const clientRecord = database.lookup(client);
  return clientRecord.isActive();
}

名稱

大家第一次聽到螞蟻上樹的時候覺得他是什麼呢?名稱真的很重要。
至少讓別人一看就知道這個function大概在做什麼

//Bad

function check(email) {
  // ...
}
check("eamil@email.com")

//Better

function checkEmailExist(email){
	//...
}
checkEmailExist("eamil@email.com")

另外函數命名可以用動詞開頭來開頭,讓他跟英文文法相符 ex : doSomething()

移除重複的(Duplicate)程式碼

為什麼所有語言都在提倡不重複這件事呢?

重複的程式碼代表著更動邏輯時,要改很多地方,就像在寫css 同樣的元件你不小心寫了四種一樣的class ,改的時候發現有些頁面的沒改到,很惱人


//Bad

function showTeacherList(teachers) {
	teachers.forEach(teacher => {
    const name = teacher.getName();
    const age = teacher.getAge();
    const salary = teacher.getSalary();
    const data = {
      name,
      age,
      salary
    };
    render(data);
  });
}

function showStudentList(students) {
	students.forEach(student => {
    const Name = student.getName();
    const Age = student.getAge();
    const score = student.getScore();
    const data = {
      name,
      age,
      score
    };
    render(data);
  });
}

//Better

function showUserList(users){
	users.forEach(user => {
    const name = user.getName();
    const age = user.getAge();
    const data = {
      name,
      age
    };
	switch (user.type) {
      case 'teacher':
        data.salary = user.getSalary();
        break;
      case 'student':
        data.score = user.getScore();
        break;
    }
    render(data);
  });
}

避免全域變數與副作用(Side Effects)

當函數作用在除了回傳值外的地方,像是讀寫文件、修改全域變數或是吃藥然後想睡覺,稱為副作用。

程式在某些情況下是需要副作用的,像是上面所提到的例子。這時你應該將這些功能集中在一起,不要同時有多個函數或是類別同時操作資源,應該只用一個服務(Service)完成這些事情。

常見的問題像是:

  • 在沒有任何架構下,同時多個物件中分享共有狀態。
  • 有可變的狀態,而且任何人都可以寫入
  • 沒有將副作用發生的地方集中

如果你能避免這些問題,你會比大多數的工程師快樂。

// 全域變數被以下函數使用
// 假如有其他的函數使用了這個名稱,現在他變成了陣列,將會被破壞而出錯。
let name = 'Dylan Chen';

function splitIntoFirstAndLastName() {
  name = name.split(' ');
}

splitIntoFirstAndLastName();

console.log(name); // ['Dylan', 'Chen'];

適當的:

function splitIntoFirstAndLastName(name) {
  return name.split(' ');
}

const name = 'Dylan Chen';
const newName = splitIntoFirstAndLastName(name);

console.log(name); // 'Dylan Chen';
console.log(newName); // ['Dylan', 'Chen'];

function要注意的東西太多了,明天繼續補充 ~


上一篇
Day 3 - 註解 (Comments) & 編排(Formatting)
下一篇
Day 5 - 函式 (Function) part 2
系列文
React Clean Code And Unit Tests - 利用測試寫出人類看得懂的React程式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言